/**
 *******************************************************************************
 * @brief       Provide a brief description of the module here (Single line).
 * 
 * @author      Ashwin
 * 
 * @file        soft_delay.c
 * 
 * @version
 * 
 * @date        Feb 6, 2012 9:14:29 PM
 * 
 * @details     Provide a detailed description of the module here (Multi-line).
 * 
 * @pre         Mention any preconditions required to use this module.
 * 
 * @bug         List any bugs in this module.
 * 
 * @note        List any odd modes while using this module.
 * 
 * @warning     List any warnings against using the objects of this module.
 *******************************************************************************
 * @copyright 2012
 * <a href="http://www.afflatustech.com">Afflatus Techtronics</a>
 * and <a href="http://www.ashwinvijayakumar.co.nr">Ashwin Vijayakumar</a>
 * @n@n
 * This work is licensed under the Creative Commons
 * Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a copy
 * of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ or
 * send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain
 * View, California, 94041, USA.
 *******************************************************************************
 */

/**@cond -----------------------------------------------------------------------
 * Includes section
 * Add all #include here.
 * ----------------------------------------------------------------- @endcond */

/**@cond System headers -------------------------------------------- @endcond */
#include <delays.h>

/**@cond Local headers --------------------------------------------- @endcond */
#include "Soft_Delay.h"
#include "McalMcu_Conf.h"

/**@cond -----------------------------------------------------------------------
 * typedef section (File scope)
 * Add typedef's with file scope here.
 * Capitalization: Upper_Camel_Case.
 * Declare typedef's with project scope in soft_delay.h.
 * ----------------------------------------------------------------- @endcond */

/**@cond -----------------------------------------------------------------------
 * Constants section (File scope)
 * Add all constants with file scope here.
 * Capitalization: ALL_CAPS.
 * Note that all constants listed here are limited to this file scope.
 * For project wide scope, declare constants in soft_delay.h.
 * ----------------------------------------------------------------- @endcond */

/**@cond -----------------------------------------------------------------------
 * Macros section (File scope)
 * Add all macros with file scope here.
 * Capitalization: ALL_CAPS.
 * Note that all macros listed here are limited to this file scope.
 * For project wide scope, declare macros in soft_delay.h.
 * ----------------------------------------------------------------- @endcond */

/**@cond -----------------------------------------------------------------------
 * Global variables section (File scope)
 * Add global variables with file scope here. 
 * Capitalization: lower_case.
 * Declare them with 'static' keyword.
 * ----------------------------------------------------------------- @endcond */

/**@cond -----------------------------------------------------------------------
 * Global variables section (Project scope)
 * PROJECT SCOPE G-VARIABLES ARE LIKE FORBIDDEN FRUIT. REFRAIN FROM USING THEM, 
 * DECLARE FILE SCOPE G-VARIABLES INSTEAD AND DEFINE GETTER/SETTER METHODS TO 
 * ACCESS THEM.
 * Add global variables with project scope here. 
 * Capitalization: lower_case.
 * Declare them without 'static' keyword.
 * Also declare these variables in soft_delay.h with 'extern' keyword.
 * ----------------------------------------------------------------- @endcond */

/**@cond -----------------------------------------------------------------------
 * Function prototypes section (File scope)
 * Add prototypes for all functions with file scope here. 
 * Capitalization: lower_Camel_Case.
 * Declare them with 'static' keyword.
 * For functions with project scope, declare the function prototype in 
 * soft_delay.h without 'static' keyword.
 * ----------------------------------------------------------------- @endcond */

/**@cond -----------------------------------------------------------------------
 * Getter/setter method section (Project scope)
 * Define getter/setter methods to provide project scope global access to file 
 * scope global variables. (AVOID USING THESE IF YOU HAVE THROUGHPUT ISSUES).
 * Capitalization: get_Camel_Case/is_Camel_Case/set_Camel_Case.
 * Declare the prototype for these functions in soft_delay.h. 
 * ----------------------------------------------------------------- @endcond */

/**@cond ***********************************************************************
 * TODO: Update all comment fields and delete this line.
 * MOD: For functions with project scope, remove 'static' keyword and declare
 * prototype in soft_delay.h
 * -------------------------------------------------------------------- @endcond
 * @fn          return_type function_name(TYPE parameter1, TYPE parameter2)
 * @return      Describe the function's return value here.
 * @param       parameter1 Describe the function's 1st parameter here.
 * @param       parameter2 Describe the function's 2nd parameter here.
 * @author      Ashwin
 * @date        Feb 6, 2012, 9:30:55 PM
 * @brief	Provide a brief description of the module here (Single line).
 * @details	Provide a detailed description of the module here (Multi-line).
 * @pre         Mention any preconditions required to use this function.
 * @post        Mention any postcondition required to use this function.
 * @bug         List any bugs in this module.
 * @note        List any odd modes while using this function.
 * @warning     List any warnings against using the objects of this function.
 *******************************************************************************
 */

void
delay_ns(uint16_t ns)
{
  uint16_t delay_ticks = ns * (F_CPU/1000000000);

  if(delay_ticks <= 1)
    {
      Delay1TCY();
    }
  else if((delay_ticks > 1) && (delay_ticks < 10))
    {
      while(delay_ticks--)
        {
          Delay1TCY();
        }
    }
  else if((delay_ticks >= 10) && (delay_ticks < 256))
    {
      Delay10TCYx((unsigned char)(delay_ticks/10));
    }
  else if((delay_ticks >= 256) && (delay_ticks < 25600))
    {
      Delay100TCYx((unsigned char)(delay_ticks/100));
    }
  else if((delay_ticks >= 25600) && (delay_ticks < 256000))
    {
      Delay1KTCYx((unsigned char)(delay_ticks/1000));
    }
  else if((delay_ticks >= 256000) && (delay_ticks < 2560000))
    {
      Delay10KTCYx((unsigned char)(delay_ticks/10000));
    }
  else
    {
      /* Print compiler error indicating that the value is out of range */
    }
}

/** End of function_name ************ Copyright (C) 2012 Afflatus Techtronics */

/**@cond ***********************************************************************
 * TODO: Update all comment fields and delete this line.
 * MOD: For functions with project scope, remove 'static' keyword and declare
 * prototype in soft_delay.h
 * -------------------------------------------------------------------- @endcond
 * @fn          return_type function_name(TYPE parameter1, TYPE parameter2)
 * @return      Describe the function's return value here.
 * @param       parameter1 Describe the function's 1st parameter here.
 * @param       parameter2 Describe the function's 2nd parameter here.
 * @author      Ashwin
 * @date        Feb 6, 2012, 9:19:04 PM
 * @brief	Provide a brief description of the module here (Single line).
 * @details	Provide a detailed description of the module here (Multi-line).
 * @pre         Mention any preconditions required to use this function.
 * @post        Mention any postcondition required to use this function.
 * @bug         List any bugs in this module.
 * @note        List any odd modes while using this function.
 * @warning     List any warnings against using the objects of this function.
 *******************************************************************************
 */

void
delay_us(uint16_t us)
{
  uint16_t delay_ticks = us * (F_CPU/1000000);

  if(delay_ticks <= 1)
    {
      Delay1TCY();
    }
  else if((delay_ticks > 1) && (delay_ticks < 10))
    {
      while(delay_ticks--)
        {
          Delay1TCY();
        }
    }
  else if((delay_ticks >= 10) && (delay_ticks < 256))
    {
      Delay10TCYx((unsigned char)(delay_ticks/10));
    }
  else if((delay_ticks >= 256) && (delay_ticks < 25600))
    {
      Delay100TCYx((unsigned char)(delay_ticks/100));
    }
  else if((delay_ticks >= 25600) && (delay_ticks < 256000))
    {
      Delay1KTCYx((unsigned char)(delay_ticks/1000));
    }
  else if((delay_ticks >= 256000) && (delay_ticks < 2560000))
    {
      Delay10KTCYx((unsigned char)(delay_ticks/10000));
    }
  else
    {
      /* Print compiler error indicating that the value is out of range */
    }
}

/** End of function_name ************ Copyright (C) 2012 Afflatus Techtronics */

/**@cond ***********************************************************************
 * TODO: Update all comment fields and delete this line.
 * MOD: For functions with project scope, remove 'static' keyword and declare
 * prototype in soft_delay.h
 * -------------------------------------------------------------------- @endcond
 * @fn          void function_name(TYPE parameter1, TYPE parameter2)
 * @return      Describe the function's return value here.
 * @param       parameter1 Describe the function's 1st parameter here.
 * @param       parameter2 Describe the function's 2nd parameter here.
 * @author      Ashwin
 * @date        Feb 6, 2012, 9:27:19 PM
 * @brief	Provide a brief description of the module here (Single line).
 * @details	Provide a detailed description of the module here (Multi-line).
 * @pre         Mention any preconditions required to use this function.
 * @post        Mention any postcondition required to use this function.
 * @bug         List any bugs in this module.
 * @note        List any odd modes while using this function.
 * @warning     List any warnings against using the objects of this function.
 *******************************************************************************
 */

void
delay_ms(uint16_t ms)
{
  uint16_t delay_ticks = ms * (F_CPU/1000);

  if(delay_ticks <= 1)
    {
      Delay1TCY();
    }
  else if((delay_ticks > 1) && (delay_ticks < 10))
    {
      while(delay_ticks--)
        {
          Delay1TCY();
        }
    }
  else if((delay_ticks >= 10) && (delay_ticks < 256))
    {
      Delay10TCYx((unsigned char)(delay_ticks/10));
    }
  else if((delay_ticks >= 256) && (delay_ticks < 25600))
    {
      Delay100TCYx((unsigned char)(delay_ticks/100));
    }
  else if((delay_ticks >= 25600) && (delay_ticks < 256000))
    {
      Delay1KTCYx((unsigned char)(delay_ticks/1000));
    }
  else if((delay_ticks >= 256000) && (delay_ticks < 2560000))
    {
      Delay10KTCYx((unsigned char)(delay_ticks/10000));
    }
  else
    {
      /* Print compiler error indicating that the value is out of range */
    }
}

/** End of function_name ************ Copyright (C) 2012 Afflatus Techtronics */


/** END OF FILE ********************* Copyright (C) 2012 Afflatus Techtronics */
